package com.self.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.self.reggie.common.R;
import com.self.reggie.entity.User;
import com.self.reggie.service.UserService;
import com.self.reggie.utils.SMSUtils;
import com.self.reggie.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.bouncycastle.pqc.crypto.lms.LMOtsParameters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 实现了发送验证码(redis)，和移动端用户登录的功能
 */
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 发送验证码
     * 使用阿里云的api发送短信，需要注册签名和模板等很麻烦，这里直接在前端生成验证码
     * 下面只需要将templateCode填上代码就可以完整的实现阿里云发送验证码的功能
     * @param map
     * @return
     */
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody Map map, HttpSession session){
        //获取手机号
        String phone = map.get("phone").toString();

        /*if (StringUtils.isNotEmpty(phone)){
            //生成随机4位验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info("code={}",code);

            //调用阿里云短信api发送短信
            SMSUtils.sendMessage("瑞吉外卖"," ",phone, code);

            //保存生成验证码到session中,登录时要进行校验
            //session.setAttribute(phone,code);

            return R.success("验证码发送成功");

        }*/

        //模拟阿里云接口发出的验证码,将前端接受到的验证码存入session中
        //String code=map.get("code").toString();
        //session.setAttribute("phone",code);

        //将前段发送过来的验证码使用redis储存,并设置有效期为5分钟
        String code=map.get("code").toString();
        redisTemplate.opsForValue().set(phone,code, 5, TimeUnit.MINUTES);

        return  R.success("短信发送成功") ;
    }

    /**
     * 移动端用户登录
     * @param map
     * @return
     */
    @PostMapping("/login")
    public R<User> login(@RequestBody Map map, HttpSession session){
        log.info("移动端用户登录，信息：",map.toString());

        //获取页面传回来的手机号和验证码
        String phone = map.get("phone").toString();
        String code = map.get("code").toString();

        //比对验证码是否与前面存入session中的一致3
        //Object codeInSession = session.getAttribute("phone");

        //取出redis中的验证码,查看是否一致
        Object codeInSession = redisTemplate.opsForValue().get(phone);
        log.info("redis中的验证码为：",codeInSession);

        if (codeInSession!=null && code.equals(codeInSession)){
            //登录成功，判断手机号是否注册，没有注册就注册一个
            LambdaQueryWrapper<User> queryWrapper=new LambdaQueryWrapper();
            queryWrapper.eq(User::getPhone,phone);
            User user = userService.getOne(queryWrapper);

            //当前用户为新用户，直接注册一个
            if (user==null){
                User user1 = new User();
                user1.setPhone(phone);
                user1.setStatus(1);
                userService.save(user1);
            }


            //登录成功，将用户的id存入域中，方便拦截器中判断是否登陆了
            session.setAttribute("user",user.getId());

            //用户登录成功,删除redis中的验证码
            redisTemplate.delete(phone);

            //将用户返回给客户端，客户端也许要保存一份
            return R.success(user);
        }

        return R.error("登录失败");
    }
}
